package org.yzhzc.system.controller.question;

import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.yzhzc.common.core.controller.BaseController;
import org.yzhzc.common.core.domain.R;
import org.yzhzc.common.core.domain.TableDataInfo;
import org.yzhzc.system.domain.question.dto.QuestionAddDTO;
import org.yzhzc.system.domain.question.dto.QuestionEditDTO;
import org.yzhzc.system.domain.question.dto.QuestionQueryDTO;
import org.yzhzc.system.domain.question.vo.QuestionDetailVO;
import org.yzhzc.system.service.question.IQuestionService;

/**
 * 题目管理（QuestionController）
 * 题目相关的操作接口，如查询、添加、编辑和删除题目。
 */
@RestController
@RequestMapping("/question")  // 基础路径 /question，所有接口都以此为前缀
@Tag(name = "题目管理接口")  // 用于 Swagger 文档生成，描述该控制器的功能
public class QuestionController extends BaseController {

    // 注入题目管理服务接口
    @Autowired
    private IQuestionService questionService;

    /**
     * 获取题目列表
     * 根据查询条件返回题目列表，支持分页。
     *
     * @param questionQueryDTO 查询参数，包含题目搜索条件
     * @return TableDataInfo 返回分页后的题目数据，包括列表和总记录数
     */
    @GetMapping("/list")  // 映射 GET 请求，路径为 /question/list
    public TableDataInfo list(QuestionQueryDTO questionQueryDTO) {
        // 调用服务层获取题目列表数据，并封装成 TableDataInfo 返回
        return getTableDataInfo(questionService.list(questionQueryDTO));
    }

    /**
     * 添加新题目
     * 接受前端传入的题目添加数据，并调用服务层进行保存操作。
     *
     * @param questionAddDTO 要添加的题目信息
     * @return R<Void> 操作结果，成功或失败
     */
    @PostMapping("/add")  // 映射 POST 请求，路径为 /question/add
    public R<Void> add(@RequestBody QuestionAddDTO questionAddDTO) {
        // 调用服务层添加题目，并返回操作结果
        return toR(questionService.add(questionAddDTO));
    }

    /**
     * 获取题目详情
     * 根据题目 ID 查询题目的详细信息。
     *
     * @param questionId 题目 ID
     * @return R<QuestionDetailVO> 包含题目详情的响应对象
     */
    @GetMapping("/detail")  // 映射 GET 请求，路径为 /question/detail
    public R<QuestionDetailVO> detail(Long questionId) {
        // 调用服务层查询题目详情，并返回操作结果
        return R.ok(questionService.detail(questionId));
    }

    /**
     * 编辑题目
     * 接受前端传入的题目信息并进行修改。
     *
     * @param questionEditDTO 要编辑的题目信息
     * @return R<Void> 操作结果，成功或失败
     */
    @PutMapping("/edit")  // 映射 PUT 请求，路径为 /question/edit
    public R<Void> edit(QuestionEditDTO questionEditDTO) {
        // 调用服务层编辑题目，并返回操作结果
        return toR(questionService.edit(questionEditDTO));
    }

    /**
     * 删除题目
     * 根据题目 ID 删除指定的题目。
     *
     * @param questionId 题目 ID
     * @return R<Void> 操作结果，成功或失败
     */
    @DeleteMapping("/delete")  // 映射 DELETE 请求，路径为 /question/delete
    public R<Void> delete(Long questionId) {
        // 调用服务层删除题目，并返回操作结果
        return toR(questionService.delete(questionId));
    }
}
